% Autore: Lorenzo Visentin
% Argomenti: ristrutturazione schema ER, schema relazionale, vincoli di integrità.


\chapter{Progettazione logica}
\label{chPrgLogica}

Per poter proseguire nella traduzione del modello Entità-Associazione al modello relazionale è necessario provvedere ad una sua ristrutturazione, per eliminare tutte quelle caratteristiche non rappresentabili. Si illustrano brevemente nel seguito le attività svolte, nonché la produzione vera e propria dello schema relazionale.

\section{Ristrutturazione dello schema ER}
\label{parRistrER}

%Lo schema ER prodotto durante la fase di progettazione è stato sottoposto a ristrutturazione in modo tale da predisporlo alla successiva traduzione nel modello relazionale. Si illustrano qui brevemente le attività che sono state svolte.

Per prima cosa si è scelto di sostituire alcuni identificatori esterni con codici seriali opportuni, qualora essi dovessero coinvolgere a catena più di un'associazione oppure necessitare dell'unione di molti campi; l'introduzione di identificatori numerici consente da un lato di ridurre il carico computazionale, aggravato dalle necessarie operazioni di confronto carattere per carattere per identificatori di tipo stringa, ma ha lo svantaggio di peggiorare la leggibilità e, quando tradotto nella base di dati fisica vera e propria, può portare ad aumentare il numero di relazioni coinvolte nelle interrogazioni. Gli identificatori numerici sono stati introdotti in \texttt{Utente}, \texttt{Proiettore}, \texttt{Sala} e \texttt{Poltrona} (quest'ultima necessitava prima di chiavi da ben quattro campi per la sua identificazione).

L'attività di ristrutturazione più significativa del modello ER è stata però la rimozione delle relazioni IS-A, non rappresentabili nel modello relazionale. Prima della ristrutturazione l'entità Biglietto si trovava in relazione di specializzazione con l'entità Biglietto Online, allo scopo di identificare gli acquisti avvenuti tramite il sito internet; di fatto però la qualità di ``biglietto prenotato online'' può essere ancora ricavata dalla presenza o meno dell'associazione con l'entità Utente, che diventa così a partecipazione non obbligatoria dal lato Biglietto.
Pertanto abbiamo deciso di accorpare l'entità Biglietto Online in quella più generale di Biglietto.

L'accorpamento non poteva avvenire per l'entità Film, poiché un film partecipa ad associazioni differenti rispetto ad un semplice evento -- ad esempio un film richiede di essere noleggiato--; l'unica alternativa quindi percorribile era la sostituzione della relazione di specializzazione con un'associazione uno a uno.

La Figura \ref{figERDefRistr} illustra il diagramma generale ristrutturato.


\begin{landscape}
\begin{figure}[p]
\begin{center}
\includegraphics[height=\textwidth, clip=true, trim=1.5cm 0 0 0]{img/ERRistrutturatoDefinitivo.pdf}
  \caption{\emph{Schema ER completo ristrutturato.}}
  \label{figERDefRistr}
\end{center}
\end{figure}
\end{landscape}

\begin{landscape}
\begin{figure}[n]
\begin{center}
\includegraphics[height=\textwidth]{img/RelazionaleDefinitivo.pdf}
  \caption{\emph{Schema relazionale completo.}}
  \label{figRelazDef}
\end{center}
\end{figure}
\end{landscape}


\section{Schema relazionale}
\label{parSchemaRelaz}

A partire dallo schema ER ristrutturato abbiamo effettuato la traduzione in schema relazionale. La traduzione è stata immediata e non si sono resi necessari ulteriori interventi.

In figura \ref{figRelazDef} si può osservare lo schema relazionale completo finale. In particolare, gli attributi stampati in corsivo possono essere nulli.


\section{Vincoli di integrità}
\label{parVincoliIntegrita}

Dalla figura che rappresenta lo schema relazionale si possono desumere i vincoli di chiave primaria (indicati da sottolineature) e i vincoli di integrità referenziale (rappresentati mediante frecce che collegano attributi corrispondenti).


\subsection{Altri vincoli di chiave}
\label{subparVincoliChiave}

Si riportano ora gli altri vincoli di chiave candidata che sono stati definiti.

\begin{itemize}
\item \textbf{Sede} 
\begin{itemize}
\item Nome.
\item Latitudine, Longitudine.
\end{itemize}
\end{itemize}

\begin{itemize}
\item \textbf{Sala} 
\begin{itemize}
\item Sigla, CodiceSede.
\end{itemize}
\end{itemize}

\begin{itemize}
\item \textbf{Poltrona} 
\begin{itemize}
\item IDSala, Fila, Numero.
\end{itemize}
\end{itemize}

\begin{itemize}
\item \textbf{Proiettore} 
\begin{itemize}
\item Seriale.
\end{itemize}
\end{itemize}

\begin{itemize}
\item \textbf{Palinsesto} 
\begin{itemize}
\item DataOra, CodiceEvento, In3D.
\end{itemize}
\end{itemize}

\begin{itemize}
\item \textbf{Utente} 
\begin{itemize}
\item Email.
\item CodFiscale.
\end{itemize}
\end{itemize}

\pagebreak % necessario altrimenti inzia con 2 righe e spezza dopo evento

\subsection{Vincoli di dominio e di tupla}
\label{subparVincoliDominioTupla}

Vengono qui elencati i rimanenti vincoli di dominio e di tupla.

\begin{itemize}
\item \textbf{Evento} 
\begin{itemize}
\item L'attributo DurataInSala deve assumere un valore maggiore o uguale rispetto a quello di DurataProiezione.
\end{itemize}
\end{itemize}

\begin{itemize}
\item \textbf{Noleggio} 
\begin{itemize}
\item L'attributo DataFine deve assumere un valore maggiore di quello di DataInizio.
\item Almeno uno tra gli attributi In2D e In3D deve essere posto a true.
\end{itemize}
\end{itemize}

\begin{itemize}
\item \textbf{Fornitore} 
\begin{itemize}
\item Almeno uno tra gli attributi Telefono, Email e URL deve essere non nullo.
\end{itemize}
\end{itemize}

\begin{itemize}
\item \textbf{Abbonamento} 
\begin{itemize}
\item L'attributo TotaleIngressi deve assumere un valore maggiore o uguale a 0.
\end{itemize}
\end{itemize}

\begin{itemize}
\item \textbf{Listino} 
\begin{itemize}
\item L'attributo TotaleIngressi deve assumere un valore maggiore di 0.
\end{itemize}
\end{itemize}

Inoltre a tutti gli attributi di tipo monetario è stato associato un nuovo dominio Valuta, definito come un dominio MONEY, con l'ulteriore vincolo che la cifra sia maggiore o uguale a 0. Il codice SQL completo di creazione delle relazioni è consultabile all'appendice \ref{appendiceSQL}.